perm filename CALDRV.SAI[SYS,HE] blob sn#004269 filedate 1972-08-25 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00010 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002	BEGIN "CALDRV"
 00005 00003	SIMPLE PROCEDURE TRANSFER(INTEGER TODSK,BLOCK REFERENCE INTEGER FLAG)
 00007 00004	SIMPLE PROCEDURE FILER
 00011 00005	PROCEDURE PAN_TILT_ARM_CAL
 00015 00006	    IF (EYEFLG≠0)∧(MANU≠0) THEN BEGIN
 00019 00007	PROCEDURE FOC_ARM_CAL
 00022 00008	
 00024 00009	PROCEDURE CALCHK
 00026 00010	  IF RUN≠0 THEN BEGIN
 00029 ENDMK
⊗;
BEGIN "CALDRV"
	REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
        REAL ARRAY PPOT0,PPOTD,TPOT0,TPOTD,FPOT0,FPOTD,MART,SWING,
                   FOC,FOCLEN0,FOCLENG[1:4],DP,P0[1:4,1:3],PP[1:4,1:2];
	INTEGER MESS;
	REAL GCOR;
	DEFINE CRLF="&'15&'12"; DEFINE YES="INCHWL=""Y""";
        DEFINE ⊃="COMMENT"; DEFINE S_O_T="STOP_ON_TOUCH";
	REQUIRE "HANDSER.SAI[SYS,HE]" SOURCE_FILE;
             
SIMPLE PROCEDURE LINEFIT(INTEGER N; REAL ARRAY MES; STRING INTNAME, SLOPNAME;
	          REFERENCE REAL INTERCEPT,SLOPE);
  BEGIN "LINEFIT"
	REAL X,Y,SX,SY,SQX,SQY,SXY,NEWINT,NEWSLOP;
	INTEGER I;

    SX←SY←SQX←SQY←SXY←0;
    FOR I←1 STEP 1 UNTIL N DO BEGIN
    X←MES[I,1]; Y←MES[I,2];
    SX←SX+X; SY←SY+Y; SQX←SQX+X↑2; SQY←SQY+Y↑2; SXY←SXY+X*Y; END;

    OUTSTR("...TYPE Y TO UPDATE "&INTNAME&" ONLY:"CRLF);
    IF  YES
    THEN NEWSLOP←SLOPE
    ELSE NEWSLOP←(N*SXY-SX*SY)/(N*SQX-SX↑2);
    NEWINT←(SY-NEWSLOP*SX)/N;
    OUTSTR("LINEFIT: "&INTNAME&"="&CVG(INTERCEPT)&SLOPNAME&"="&CVG(SLOPE)CRLF);
    OUTSTR("         N="&CVS(N)&"  NEW_"&INTNAME&"="&CVG(NEWINT)&
		        "NEW_"&SLOPNAME&"="&CVG(NEWSLOP)CRLF);
    OUTSTR("...TYPE Y TO UPDATE:"CRLF);
    IF YES THEN BEGIN INTERCEPT←NEWINT; SLOPE←NEWSLOP; END;
  END "LINEFIT";

SIMPLE REAL PROCEDURE COSQR(REAL A,B,C);
  ⊃ Solves the eq. Acos(x)+Bsin(x)+C=0 for x;
  BEGIN FORTRAN REAL PROCEDURE ACOS(REAL X);
	FORTRAN REAL PROCEDURE SQRT(REAL X);
	REAL K,M,N;
    
    K←A*C; M←A↑2+B↑2; N←B↑2-C↑2;
    IF   A*B<0
    THEN RETURN(ACOS(-(K/M)+SQRT((K/M)↑2+(N/M))))
    ELSE RETURN(ACOS(-(K/M)-SQRT((K/M)↑2+(N/M))));
  END "COSQR";
SIMPLE PROCEDURE TRANSFER(INTEGER TODSK,BLOCK; REFERENCE INTEGER FLAG);
 BEGIN INTEGER  DUMMY;
  DEFINE XFR(EX)="IF TODSK THEN ARRYOUT(3,EX,1) ELSE ARRYIN(3,EX,1)";
  OPEN(3,"DSK",12,3,3,0,0,0);
  LOOKUP(3,"DATA[SYS,HE]",FLAG);
  IF FLAG THEN BEGIN OUTSTR("TRANSFER-FAILED: LOOKUP FAILED (BLOCK="&
			    CVS(BLOCK)&")"CRLF); RETURN; END;
  USETI(3,1); DUMMY←WORDIN(3);
  IF TODSK THEN BEGIN ENTER(3,"DATA[SYS,HE]",FLAG);
  IF FLAG THEN BEGIN OUTSTR("TRANSFER-FAILED: ENTER FAILED (BLOCK="&
			    CVS(BLOCK)&")"CRLF); RETURN; END; END;
  IF TODSK THEN USETO(3,BLOCK) ELSE USETI(3,BLOCK);
  XFR(PPOT0[BLOCK]); XFR(PPOTD[BLOCK]); XFR(TPOT0[BLOCK]); XFR(TPOTD[BLOCK]);
  XFR(FPOT0[BLOCK]); XFR(FPOTD[BLOCK]);
  XFR(MART[BLOCK]);  XFR(SWING[BLOCK]);
  XFR("PP[BLOCK,1]");XFR("PP[BLOCK,2]");XFR("P0[BLOCK,1]");XFR("P0[BLOCK,2]");
  XFR("P0[BLOCK,3]");XFR("DP[BLOCK,1]");XFR("DP[BLOCK,2]");XFR("DP[BLOCK,3]");
  XFR(FOC[BLOCK]); XFR(FOCLEN0[BLOCK]); XFR(FOCLENG[BLOCK]);
  RELEASE(3);
END "TRANSFER";
SIMPLE PROCEDURE FILER;
 BEGIN "FILER"
  INTEGER LPT,FLAG,BLOCK,TODSK; STRING ST;
  DEFINE CHANGEF(VAR)="OUTSTR(""VAR""&""=""&CVG(VAR)&""...TYPE NEW"");
		       OUTSTR("" VALUE OR CR.=""CRLF);
		       IF (ST←INCHWL)≠NULL THEN VAR←REALSCAN(ST,FLAG);";

  LPT←0; BLOCK←1;
  CHANGEF(BLOCK);
  OUTSTR("...TYPE Y WRITE ON DSK, CR TO READ FROM DSK INTO MEMORY:"CRLF);
  IF   YES
  THEN BEGIN 
  OUTSTR("...TYPE Y FOR MANUAL:"CRLF);
  IF YES THEN BEGIN
  CHANGEF(PPOT0[BLOCK]);   CHANGEF(PPOTD[BLOCK]);   CHANGEF(TPOT0[BLOCK]);
  CHANGEF(TPOTD[BLOCK]);   CHANGEF(FPOT0[BLOCK]);   CHANGEF(FPOTD[BLOCK]);
  CHANGEF(MART[BLOCK]);    CHANGEF(SWING[BLOCK]);
  CHANGEF("PP[BLOCK,1]");  CHANGEF("PP[BLOCK,2]");
  CHANGEF("P0[BLOCK,1]");  CHANGEF("P0[BLOCK,2]");  CHANGEF("P0[BLOCK,3]");
  CHANGEF("DP[BLOCK,1]");  CHANGEF("DP[BLOCK,2]");  CHANGEF("DP[BLOCK,3]");
  CHANGEF(FOC[BLOCK]);     CHANGEF(FOCLEN0[BLOCK]); CHANGEF(FOCLENG[BLOCK]);
	      END;
  TRANSFER(1,BLOCK,FLAG); END
  ELSE BEGIN TRANSFER(0,BLOCK,FLAG); IF FLAG THEN RETURN;
  OUTSTR("...TYPE Y TO PRINT, CR TO DISPLAY:"CRLF);
  IF   YES 
  THEN BEGIN OPEN(4,"LPT",0,0,2,0,0,0); LPT←1; END
  ELSE OPEN(4,"TTY",0,0,2,0,0,0);
  SETFORMAT(2,6);
  OUT(4,"    CURRENT MODEL IN BLOCK NUMBER  "&CVS(BLOCK)CRLF CRLF);
  OUT(4,"          PPOT0       PPOTD       TPOT0       TPOTD"&
	"       FPOT0       FPOTD"CRLF&"         "&CVG(PPOT0[BLOCK])
	&CVG(PPOTD[BLOCK])&CVG(TPOT0[BLOCK])&CVG(TPOTD[BLOCK])
	&CVG(FPOT0[BLOCK])&CVG(FPOTD[BLOCK])CRLF CRLF);
  OUT(4,"          MART        SWING"CRLF&"         "
	&CVG(MART[BLOCK])&CVG(SWING[BLOCK])CRLF CRLF);
  OUT(4,"          PP[1]       PP[2]"CRLF&"         "&CVG(PP[BLOCK,1])&
	CVG(PP[BLOCK,2])CRLF CRLF);
  OUT(4,"          P0[1]       P0[2]       P0[3]"CRLF&"         "
	&CVG(P0[BLOCK,1])&CVG(P0[BLOCK,2])&CVG(P0[BLOCK,3])CRLF CRLF);
  OUT(4,"          DP[1]       DP[2]       DP[3]"CRLF&"         "
	&CVG(DP[BLOCK,1])&CVG(DP[BLOCK,2])&CVG(DP[BLOCK,3])CRLF CRLF);
  OUT(4,"          FOC         FOCLEN0     FOCLENG"CRLF&"         "
	&CVG(FOC[BLOCK])&CVG(FOCLEN0[BLOCK])&CVG(FOCLENG[BLOCK])CRLF);
  SETFORMAT(0,6);
  IF  LPT=1 THEN RELEASE(4); END;
END "FILER";
PROCEDURE PAN_TILT_ARM_CAL;
  BEGIN
       REAL XERR,YERR,DX,DY,DZ,XH,YH,RAN,RAND,FMX,FMY,SXERR,SYERR,DIRX,DIRY,
	    TET,TETI,TETF,TETD,XTC,YTC,ZTC,NPPOT0,NPPOTD,NTPOT0,NTPOTD,
	    SQXERR,SQYERR,XERRI,YERRI,PAN,TILT,XCC,YCC,ZCC,RANG,D,ALPHA,BETA;
       INTEGER N,I,J,FLAG,MANU,RLENS,INI;
       REAL ARRAY DIRD[1:8],MESPAN,MESTIL[1:20,1:2];
       LABEL LAC,MAR;
       FORTRAN REAL PROCEDURE COS(REAL X);
       FORTRAN REAL PROCEDURE SIN(REAL X);
       FORTRAN REAL PROCEDURE SQRT(REAL X);


    OUTSTR("...TYPE THE LENS NO. YOU WANT TO USE="CRLF);
    RLENS←CVD(INCHWL);
    MESS←ISSUE(7,"DRV","CAM",MESSAGE CHNG_LENS(RLENS));
    IF CAMFLG≠0 THEN RETURN;
    LOOK_AT[1]←1;

    IF RLENS=1 THEN LOOK_AT[4]←LOOK_AT[5]←12 ELSE LOOK_AT[4]←LOOK_AT[5]←18;
    N←0; SXERR←SYERR←0; XERRI←YERRI←0;
    DX←-.3; DY←-((GRASP-GCOR)/2+.55); DZ←0;

    OUTSTR("...TYPE Y TO UPDATE FROM ALL OVER THE TABLE :"CRLF);
    IF YES THEN BEGIN RAND←10.0; TETI←0.0; TETD←.314; TETF←3.2; END
           ELSE BEGIN RAND←5.0; TETI←.6; TETD←.4; TETF←2.25; END;
    OUTSTR("...TYPE Y IF YOU WANT TO HELP:"CRLF);
    IF YES THEN MANU←1 ELSE MANU←0;

    FOR RAN←15.0 STEP RAND UNTIL 25.0 DO BEGIN XERR←XERRI; YERR←YERRI; INI←0;
    FOR TET←TETI STEP TETD UNTIL TETF DO BEGIN
    XH←20-RAN*COS(TET); YH←10+RAN*SIN(TET);
    IF (XH<0)∨(XH>40)∨(YH<5)∨(YH>36) THEN GOTO LAC;
    OUTSTR("PTAC: SENDING ARM TO: XH="&CVG(XH)&"  YH="&CVG(YH)CRLF);
    DIRY←SQRT((XH-CAMERA_MODEL[4,1])↑2+(YH-CAMERA_MODEL[4,2])↑2); 
    DIRX←(XH-CAMERA_MODEL[4,1])/DIRY;
    DIRY←(YH-CAMERA_MODEL[4,2])/DIRY;
    POSE_HAND(XH,YH,1,DIRX,DIRY,FLAG);
    IF FLAG≠0 THEN GOTO LAC;

    ARMTRAN(DX,DY,DZ,XTC,YTC,ZTC);
    MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_CENTER(RLENS,XTC,YTC,ZTC));
    IF CAMFLG≠0 THEN GOTO LAC;
    CORN_HAND(DX,DY,DZ,DIRD);
    LOOK_AT[2]←DIRD[5]-XERR; LOOK_AT[3]←DIRD[6]-YERR;
    MESS←ISSUE(7,"DRV","EYE",MESSAGE SRCH_IMAGE(1,1,3,.05,DIRD));
    IF (EYEFLG≠0)∧(MANU=0) THEN GOTO LAC;

    IF (EYEFLG≠0)∧(MANU≠0) THEN BEGIN
MAR:   OUTSTR("...TO HELP, MOVE THE CAMERA IF NEEDED AND THEN TYPE Y:"CRLF);
       IF   YES 
       THEN BEGIN MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_UPDATE);
       	    IF CAMFLG≠0 THEN GOTO MAR;
	    CORN_HAND(DX,DY,DZ,DIRD);
            MESS←ISSUE(7,"DRV","EYE",MESSAGE SET_WINDOW);
	    IF EYEFLG≠0 THEN GOTO MAR;
            MESS←ISSUE(7,"DRV","EYE",MESSAGE SRCH_IMAGE(1,1,3,.05,DIRD));
            IF EYEFLG≠0 THEN GOTO MAR; END
        ELSE GOTO LAC; 		END;
  
    XERR←DIRD[5]-DIR_EYE[1,5]; YERR←DIRD[6]-DIR_EYE[1,6];
    SXERR←SXERR+XERR; SYERR←SYERR+YERR;
    SQXERR←SQXERR+XERR*XERR; SQYERR←SQYERR+YERR*YERR;
    OUTSTR("PTAC: XIERR="&CVG(XERR)&"   YIERR="&CVG(YERR)CRLF); 
    IF INI=0 THEN BEGIN INI←1; XERRI←XERR; YERRI←YERR; END;

    N←N+1;
    FMY←FPOTD[RLENS]*FOCPOT+FPOT0[RLENS]; FMX←FMY*MART[RLENS];
    ALPHA←(DIR_EYE[1,5]-PP[RLENS,1])/FMX;
    BETA← (DIR_EYE[1,6]-PP[RLENS,2]+DIR_EYE[1,5]/333)/FMY;
    XCC←P0[RLENS,1]-XTC; YCC←P0[RLENS,2]-YTC; ZCC←P0[RLENS,3]-ZTC;
    PAN←COSQR(YCC,-XCC,DP[RLENS,1]);
    D←XCC*COS(PAN)+YCC*SIN(PAN);
    TILT←COSQR(ZCC,-D,-DP[RLENS,2]);
    RANG←D*COS(TILT)+ZCC*SIN(TILT)-DP[RLENS,3];
    MESPAN[N,1]←PANPOT;
    MESPAN[N,2]←PAN+ALPHA*RANG/D;
    MESTIL[N,1]←TILPOT;
    MESTIL[N,2]←TILT-RANG*(BETA-ALPHA*DP[RLENS,1]*SIN(TILT)/D)/(RANG+DP[RLENS,3]);
    LAC:  				 END; END;

    SXERR←SXERR/N; SYERR←SYERR/N;
    SQXERR←SQRT(SQXERR/N-SXERR↑2); SQYERR←SQRT(SQYERR/N-SYERR↑2);
    OUTSTR("PTAC: MEAN=("&CVG(SXERR)&CVG(SYERR)&")  S.D.=("&
			  CVG(SQXERR)&CVG(SQYERR)&")"CRLF);

    LINEFIT(N,MESPAN,"PPOT0["&CVS(RLENS)&"]","PPOTD["&CVS(RLENS)&"]",
            PPOT0[RLENS],PPOTD[RLENS]);
    LINEFIT(N,MESTIL,"TPOT0["&CVS(RLENS)&"]","TPOTD["&CVS(RLENS)&"]",
            TPOT0[RLENS],TPOTD[RLENS]);
    OUTSTR("...TYPE Y TO UPDATE THE DSK:"CRLF);
    IF YES THEN BEGIN
    TRANSFER(1,RLENS,FLAG);
    IF ¬ FLAG THEN MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_INIT);
	        END;
    HOME_ARM;
  END"PAN_TILT_ARM_CAL";
PROCEDURE FOC_ARM_CAL;
  BEGIN REAL ARRAY MESFOC[1:20,1:2],DIRD[1:8];
	INTEGER N,MANU,I,RLENS,FLAG;
	REAL XH,YH,RANG,XTC,YTC,ZTC,DX,DY,DZ,RINVAL,DIRX,DIRY;
	LABEL LAC;
        FORTRAN REAL PROCEDURE SQRT(REAL X);

    OUTSTR("...TYPE THE LENS NO. YOU WANT TO USE="CRLF);
    RLENS←CVD(INCHWL);
    MESS←ISSUE(7,"DRV","CAM",MESSAGE CHNG_LENS(RLENS));
    IF CAMFLG≠0 THEN RETURN;
    IF RLENS=1 THEN LOOK_AT[4]←LOOK_AT[5]←12 ELSE LOOK_AT[4]←LOOK_AT[5]←18;

    OUTSTR("...TYPE Y FOR MANUAL FOCUS SETTING:"CRLF);
    IF YES THEN MANU←0 ELSE MANU←1;
    LOOK_AT[1]←1;

    N←0;
    DX←-.3; DY←-((GRASP-GCOR)/2+.55); DZ←0;

    FOR I←0 STEP 1 UNTIL 7 DO BEGIN
    XH←4+I*4; YH←19+I*2;
    OUTSTR("FAC: SENDING ARM TO: XH="&CVG(XH)&"  YH="&CVG(YH)CRLF);
    DIRY←SQRT((XH-CAMERA_MODEL[4,1])↑2+(YH-CAMERA_MODEL[4,2])↑2); 
    DIRX←(XH-CAMERA_MODEL[4,1])/DIRY;
    DIRY←(YH-CAMERA_MODEL[4,2])/DIRY;
    POSE_HAND(XH,YH,1,DIRX,DIRY,FLAG);
    IF FLAG≠0 THEN GOTO LAC;

    ARMTRAN(DX,DY,DZ,XTC,YTC,ZTC);
    MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_CENTER(RLENS,XTC,YTC,ZTC));
    IF CAMFLG≠0 THEN GOTO LAC;

    IF   MANU=0  
    THEN BEGIN OUTSTR("...CHANGE TO MAN CONTROL AND FOCUS CAREFULLY..."CRLF);
         OUTSTR("...WHEN DONE CHNGE BACK TO CPTR AND TYPE Y:"CRLF);
         IF YES THEN;
         MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_UPDATE);
         IF CAMFLG≠0 THEN GOTO LAC; END
    ELSE BEGIN 
         CORN_HAND(DX,DY,DZ,DIRD);
         LOOK_AT[2]←DIRD[5]; LOOK_AT[3]←DIRD[6];
         MESS←ISSUE(7,"DRV","EYE",MESSAGE SRCH_IMAGE(1,1,3,.05,DIRD));
         IF EYEFLG≠0 THEN GOTO LAC;
         RINVAL←CAMRANG/(2*RLENS);
         MESS←ISSUE(7,"DRV","FOC",MESSAGE AUTOFOC(CAMRANG,RINVAL,4));
         IF FOCFLG≠0 THEN GOTO LAC;
	 END;

    N←N+1;
    RANG←SQRT((XTC-CAMERA_MODEL[4,1])↑2+(YTC-CAMERA_MODEL[4,2])↑2
	      +(ZTC-CAMERA_MODEL[4,3])↑2); 
    MESFOC[N,1]←FOCPOT; MESFOC[N,2]←FOC[RLENS]*RANG/(RANG-FOC[RLENS]);
    LAC:         		   END;

    OUTSTR("...FOR LENS NO 1 UPDATE FOCLEN0[1] ONLY..."CRLF);
    LINEFIT(N,MESFOC,"FOCLEN0["&CVS(RLENS)&"]","FOCLENG["&CVS(RLENS)&"]",
	    FOCLEN0[RLENS],FOCLENG[RLENS]);
    FOCLENG[1]←FOCLENG[2];
    OUTSTR("...TYPE Y TO UPDATE THE DSK:"CRLF);
    IF YES THEN BEGIN
       FOR I←1 STEP 1 UNTIL 4 DO TRANSFER(1,I,FLAG);
       MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_INIT);
	        END;
    HOME_ARM;
END "FOC_ARM_CAL";

PROCEDURE CALCHK;
  BEGIN INTEGER RLENS;
	REAL XTC,YTC,RANG;
	LABEL NEG;
	REAL ARRAY DIRD[1:8];
        FORTRAN REAL PROCEDURE SQRT(REAL X);

    OUTSTR("...TYPE THE LENS NO. YOU WANT TO USE="CRLF);
    RLENS←CVD(INCHWL);
    MESS←ISSUE(7,"DRV","CAM",MESSAGE CHNG_LENS(RLENS));
    IF CAMFLG≠0 THEN RETURN;
    LOOK_AT[1]←1;

  NEG: OUTSTR("...CHANGE TO MAN CONTROL, MOVE AND FOCUS ..."CRLF);
       OUTSTR("...WHEN DONE CHNGE BACK TO CPTR AND TYPE Y:"CRLF);
       IF YES THEN;
       MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_UPDATE);
       IF CAMFLG≠0 THEN GOTO NEG;
       MESS←ISSUE(7,"DRV","EYE",MESSAGE SET_WINDOW);
       IF EYEFLG≠0 THEN GOTO NEG;
       MESS←ISSUE(7,"DRV","EYE",MESSAGE SRCH_IMAGE(1,1,0,-1,DIRD));
       IF EYEFLG≠0 THEN GOTO NEG;
       TABLECOR(DIR_EYE[1,5],DIR_EYE[1,6],XTC,YTC);
       OUTSTR("CALCHK: CORNER AT XTC="&CVG(XTC)&"YTC="&CVG(YTC)CRLF);
       RANG←SQRT((XTC-CAMERA_MODEL[4,1])↑2+(YTC-CAMERA_MODEL[4,2])↑2+
	         (CAMERA_MODEL[4,3])↑2);
       OUTSTR("CALCHK: RANG="&CVG(RANG)&"CAMRANG="&CVG(CAMRANG)CRLF);
  END"CALCHK";
  IF RUN≠0 THEN BEGIN
  PUT_DATA(0,0,"DRV");
  OUTSTR("CALDRV-WAITING"CRLF);
  WHILE (¬YES_CAM)∨(¬YES_EYE)∨(¬YES_HAND)∨(¬YES_FOC) DO CALL(1,"SLEEP");
  OUTSTR("CALDRV-ACTIVATED"CRLF);
  HOME_ARM; GCOR←GRASP_CAL; END;

  BEGIN INTEGER BLOCK,FLAG;
	FOR BLOCK←1 STEP 1 UNTIL 4 DO TRANSFER(0,BLOCK,FLAG); END;

  IF RUN=0 THEN FILER ELSE
  BEGIN LABEL TIT; INTEGER REQUEST;
   TIT:	OUTSTR("1-READ AND WRITE THE CAMERA MODEL ON THE DSK"CRLF);
	OUTSTR("2-UPDATE PAN/TILT CALIBRATION FROM THE ARM"CRLF);
        OUTSTR("3-UPDATE PAN/TILT CALIBRATION FROM THE TABLE(NOT YET)"CRLF);
	OUTSTR("4-UPDATE FOCUS CALIBRATION FROM THE TABLE(NOT YET)"CRLF);
	OUTSTR("5-UPDATE FOCUS CALIBRATION FROM THE ARM"CRLF);
	OUTSTR("6-MANUAL CHECK OF CALIBRATION "CRLF);
	OUTSTR("...TYPE THE NO. OF PROCEDURE TO EXECUTE NOW="CRLF);
	REQUEST←CVD(INCHWL); 
 	IF (REQUEST<1)∨(REQUEST>6) THEN BEGIN 
	OUTSTR("MAIN: ILLEGAL PROCEDURE NO. ("&CVS(REQUEST)&")"CRLF);
        GOTO TIT; END;
	CASE REQUEST OF BEGIN
	BEGIN ⊃ 0;						END;
	BEGIN ⊃ 1; FILER;					END;
	BEGIN ⊃ 2; PAN_TILT_ARM_CAL;				END;
	BEGIN ⊃ 3; 						END;
	BEGIN ⊃ 4; 						END;
	BEGIN ⊃ 5;FOC_ARM_CAL;					END;
	BEGIN ⊃ 6;CALCHK;					END;
 	END;

	OUTSTR("...TYPE Y TO  TEST AGAIN:"CRLF);
	IF INCHWL="Y" THEN GOTO TIT; END;
END "CALDRV";